/* https://github.com/cirosantilli/linux-kernel-module-cheat#arm-multicore */

.global main
main:
    mov r0, #0
    ldr r1, =spinlock
    str r0, [r1]
    /* Get CPU ID. */
    mrc p15, 0, r1, c0, c0, 5
    ands r1, r1, #3
    beq cpu0_only
cpu1_only:
    mov r0, #1
    ldr r1, =spinlock
    str r0, [r1]
    dmb sy
    sev
cpu1_sleep_forever:
    wfe
    b cpu1_sleep_forever
cpu0_only:
#if !defined(GEM5)
    /* PSCI CPU_ON. */
    ldr r0, =0x84000003
    mov r1, #1
    ldr r2, =cpu1_only
    mov r3, #0
    hvc 0
#endif
spinlock_start:
    ldr r0, spinlock
    wfe
    cmp r0, #0
    beq spinlock_start
    bx lr
spinlock:
    .skip 4
